/**
 * @ClassName : _748_最短补全词
 * @Author : 骆发茂
 * @Date: 2021/12/10 19:47
 * @Description : https://leetcode-cn.com/problems/shortest-completing-word/
 */
public class _748_最短补全词_宫水三叶 {
    //根据题意，先对 licensePlatelicensePlate 进行词频统计（忽略空格和数字），然后遍历 wordswords 进行词频统计，
    // 从所有符合要求的 words[i]words[i] 找到最短的补全词。
    //【宫水三叶】简单字符串计数模拟
    class Solution {
        public String shortestCompletingWord(String licensePlate, String[] words) {
            //cnt-》licensePlate中字母出现的次数int[]
            int[] cnt = getCnt(licensePlate);
            String ans = null;
            for (String s : words) {
                int[] cur = getCnt(s);
                //ok是    确定是否是补全词标志
                boolean ok = true;
                //如果字幕出现次数不一样，ok就是false
                for (int i = 0; i < 26 && ok; i++) {
                    //licensePlate中对应的字母出现次数更多，说明不是对应符合的，false
                    //只要出现了不相等的情况，ok就一直是false状态，说明这个word已经不是需要的了
                    if (cnt[i] > cur[i]) ok = false;
                }
                //要求是符合条件（是补全词）&&还是最短的补全词，
                // 刚开始是ans==null符合，然后第一个word交给ans，剩下的继续去比较，
                // 短就替换，不短就还是  ans=第一个word
                //如果是 （是符合替换词&&是最短的）
                if (ok && (ans == null || ans.length() > s.length())) ans = s;
            }
            return ans;
        }

        //返回字符串s中字母出现的次数
        int[] getCnt(String s) {
            // license的词频数组，开辟出26个位置，一个位置里面存放这个位置对应字母的频率次数
            int[] cnt = new int[26];
            //讲string转化为array，一个一个char出来
            for (char c : s.toCharArray()) {
                // isLetter() 方法用于判断指定字符是否为字母。   将char——》tolowercase
                if (Character.isLetter(c)) cnt[Character.toLowerCase(c) - 'a']++;
            }
            return cnt;
        }

    }
}